package com.powernode.ssm.serviceImpl;

import cn.hutool.core.date.LocalDateTimeUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.powernode.ssm.dao.UserLoginTokenMapper;
import com.powernode.ssm.pojo.po.UserLoginToken;
import com.powernode.ssm.pojo.vo.TokenInfo;
import com.powernode.ssm.service.UserLoginTokenService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.Optional;

@Slf4j
@Service
public class UserLoginTokenServiceImpl implements UserLoginTokenService {

    @Autowired
    private UserLoginTokenMapper userLoginTokenMapper;

    @Override
    public void saveOrUpdateToken(String userId, String token, LocalDateTime expireTime) {
        LambdaQueryWrapper<UserLoginToken> query = new LambdaQueryWrapper<>();
        query.eq(UserLoginToken::getUserId, userId);
        UserLoginToken existing = userLoginTokenMapper.selectOne(query);

        UserLoginToken entity = new UserLoginToken();
        entity.setUserId(userId);
        entity.setToken(token);
        entity.setExpireTime(expireTime);
        entity.setCreateTime(LocalDateTime.now());
        entity.setUpdateTime(LocalDateTime.now());

        if (existing == null) {
            // 插入
            userLoginTokenMapper.insert(entity);
            log.info("[Token降级] 用户 {} 的 token 已存入数据库", userId);
        } else {
            // 更新
            entity.setId(existing.getId());
            userLoginTokenMapper.updateById(entity);
            log.info("[Token降级] 用户 {} 的 token 已更新至数据库", userId);
        }
    }

    @Override
    public Optional<UserLoginToken> getTokenByUserId(String userId) {
        LambdaQueryWrapper<UserLoginToken> query = new LambdaQueryWrapper<>();
        query.eq(UserLoginToken::getUserId, userId);
        UserLoginToken tokenEntity = userLoginTokenMapper.selectOne(query);
        return Optional.ofNullable(tokenEntity);
    }

    @Override
    public void deleteTokenByUserId(String userId) {
        LambdaQueryWrapper<UserLoginToken> query = new LambdaQueryWrapper<>();
        query.eq(UserLoginToken::getUserId, userId);
        userLoginTokenMapper.delete(query);
        log.info("[Token降级] 用户 {} 的 token 已从数据库删除", userId);
    }

    /**
     * 根据用户ID查询有效的 token（未过期）
     *
     * @param userId 用户ID
     * @return 如果存在 token 且 expire_time > 当前时间，返回 TokenInfo；否则返回 null
     */
    @Override
    public TokenInfo getTokenIfExists(String userId) {
        // 1. 查询数据库
        UserLoginToken tokenRecord = userLoginTokenMapper.findByUserId(userId);

        if (tokenRecord == null) {
            log.debug("[Token查询] 用户 {} 不存在 token 记录", userId);
            return null;
        }

        // 2. 获取 token 和 expire_time 字段
        String token = tokenRecord.getToken(); // 请确保 UserLoginToken 实体中有 getToken()
        LocalDateTime expireTime = tokenRecord.getExpireTime(); // 请确保有 getExpireTime()

        if (expireTime == null || expireTime.isBefore(LocalDateTime.now())) {
            log.debug("[Token查询] 用户 {} 的 token 已过期或未设置过期时间", userId);
            return null;
        }

        log.debug("[Token查询] 用户 {} 存在未过期的 token，token = {}, 过期时间 = {}", userId, token, expireTime);
        return new TokenInfo(token, expireTime);
    }

    /**
     * 更新用户的 token 过期时间
     */
    @Override
    public void updateTokenExpireTime(String userId, LocalDateTime newExpireTime) {
        int updated = userLoginTokenMapper.updateExpireTimeById(userId, newExpireTime);
        if (updated > 0) {
            log.info("[Token更新] 用户 {} 的 token 过期时间已更新为 {}", userId, newExpireTime);
        } else {
            log.warn("[Token更新] 用户 {} 的 token 过期时间更新失败，可能记录不存在", userId);
        }
    }
}